using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Domain.Entities;
using JGSY.CMS.LowCode.Platform.Domain.Entities;

namespace JGSY.CMS.LowCode.Platform.Domain.Interfaces
{
    /// <summary>
    /// 工作流仓储接口
    /// 提供工作流定义的专业化数据访问操作，包括工作流查询、分类管理、状态控制等功能
    /// 支持工作流的版本管理、发布控制、分类筛选、编码查询等企业级工作流管理需求
    /// 扩展基础仓储接口，增加工作流特有的业务查询和数据操作方法
    /// </summary>
    public interface IWorkflowRepository : IRepository<Workflow>
    {
        /// <summary>
        /// 根据编码查找工作流
        /// </summary>
        /// <param name="code">工作流编码</param>
        /// <returns>工作流实体</returns>
        Task<Workflow?> GetByCodeAsync(string code);

        /// <summary>
        /// 根据分类获取工作流列表
        /// </summary>
        /// <param name="category">分类</param>
        /// <returns>工作流列表</returns>
        Task<List<Workflow>> GetByCategoryAsync(string category);

        /// <summary>
        /// 获取已发布的工作流列表
        /// </summary>
        /// <returns>已发布工作流列表</returns>
        Task<List<Workflow>> GetPublishedWorkflowsAsync();

        /// <summary>
        /// 获取工作流模板列表
        /// </summary>
        /// <returns>工作流模板列表</returns>
        Task<List<Workflow>> GetTemplatesAsync();

        /// <summary>
        /// 检查工作流编码是否存在
        /// </summary>
        /// <param name="code">工作流编码</param>
        /// <param name="excludeId">排除的ID</param>
        /// <returns>是否存在</returns>
        Task<bool> IsCodeExistsAsync(string code, long? excludeId = null);

        /// <summary>
        /// 获取热门工作流列表
        /// </summary>
        /// <param name="top">数量</param>
        /// <returns>热门工作流列表</returns>
        Task<List<Workflow>> GetPopularWorkflowsAsync(int top = 10);

        /// <summary>
        /// 增加执行次数
        /// </summary>
        /// <param name="id">工作流ID</param>
        /// <returns>是否成功</returns>
        Task<bool> IncrementExecutionCountAsync(long id);
    }
}
